def copy_properties(src, dst):
    """
    这个函数的目的是为在调用被装饰函数的__name__,__doc__等双下划属性时正常显示自己的，
    而不是显示装饰函数的；
    另外通过这个可以引出带参装饰器（算是一种优化吧）
    """
    dst.__name__ = src.__name__
    dst.__doc__ = src.__doc__
    # dst.__qualname__ = src.__qualname__


def decorator(func):

    def wrapper(*args, **kwargs):
        print("before")
        ret = func(*args, **kwargs)
        print("after")
        return ret
    copy_properties(func, wrapper)
    return wrapper


@decorator    # add = decorator(add)
def add(x, y):
    """
    :x int
    :y int
    :return int
    """
    return x + y


if __name__ == "__main__":
    print(add.__name__, add.__doc__, add.__qualname__, sep='\n')
